import json
import re
from typing import Dict, Any
from utils.cache_tools.cache_control import CacheHandler
from utils.logging_tools.log_control import INFO, ERROR


class VariableReplacer:
    """处理字典中 ${variable} 表达式的变量替换类，通过字符串转换并从缓存中获取值，直接修改输入字典"""

    @staticmethod
    def replace_variables(data: Dict[str, Any]) -> Dict[str, Any]:
        """
        将字典转换为 JSON 字符串，查找并替换 ${variable} 表达式，使用缓存中的值，
        然后将结果转换回字典并更新输入字典

        参数:
            data: 包含可能带有 ${variable} 表达式的字典

        返回:
            None
        """
        # 正则表达式匹配 ${variable} 模式
        pattern = re.compile(r'\${([^{}]+)}')
        json_string = json.dumps(data)
        if not pattern.search(json_string):
            INFO.info("未检测到变量替换表达式，跳过变量替换！")
            return data

        try:
            # 将字典转换为 JSON 字符串

            # 替换所有 ${variable} 表达式
            def replace_match(match):
                var_name = match.group(1)
                # 从缓存获取值，获取不到则保留原始表达式
                cached_value = CacheHandler.get_string(var_name)
                return str(cached_value) if cached_value is not None else match.group(0)

            # 三元表达式处理，如果能拿到就返回cache_value，如果拿不到就返回要替换的表达式
            # 执行替换
            replaced_string = pattern.sub(replace_match, json_string)
            # Python 的 re.sub 方法会自动处理字符串中的所有匹配项，逐一调用 replace_match 函数。
            # INFO.info(f"替换变量完成，返回替换后的数据")
            # 将替换后的字符串转换回字典
            replaced_data = json.loads(replaced_string)

        except json.JSONDecodeError as e:
            # ERROR.error(f"无法将字典转换回 JSON: {e. msg}")
            raise ValueError(f"无法将字典转换回 JSON: {str(e)}")
        except Exception as e:
            # ERROR.error(f"变量替换过程中出错: {e}")
            raise ValueError(f"变量替换过程中出错: {str(e)}")

        return replaced_data
